package ace.cmp.data.methodname.method.name.sql.entity.resolver;

import ace.cmp.data.methodname.method.name.sql.core.enums.SqlCommandTypeEnum;
import ace.cmp.data.methodname.method.name.sql.entity.model.*;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Optional;

/**
 * @author caspar
 * @date 2023/2/18 11:17 从方法解析实体查询元数据
 */
public interface EntityMethodNameToQueryResolver {
  /**
   * 获取解析的方法
   *
   * @return
   */
  Method getMethod();

  /**
   * 获取实体映射
   *
   * @return
   */
  EntityMapping getEntityMapping();

  /**
   * sql command 类型
   *
   * @return
   */
  SqlCommandTypeEnum getSqlCommandType();

  /**
   * 获取多少条数据
   */
  Optional<Integer> getTopNumber();

  /**
   * 包含 distinct 关键字
   */
  Boolean getDistinct();

  /**
   * 从方法名上解析实体属性的选择属性元数据
   *
   * @return 可空
   */
  List<EntityPropertyMapping> getProperties();

  /**
   * 从方法名上解析实体属性过滤条件元数据
   * 例子：findIdAndNameAndCodeByIdAndName,
   * 结果：Id equal,Name equal
   *
   * @return
   */
  List<EntityMethodNameToQueryFilter> getFilters();

  /**
   * 从方法名上解析实体属性排序信息
   * 例子：findIdAndNameAndCodeByIdAndNameOrderByIdDescNameAsc
   * 结果：Id desc,Name Asc
   */
  List<EntityMethodNameToQuerySort> getSorts();
}
